{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# diabetes-LR&SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "dpath = '/Users/limeng/Desktop/ML\\DL learn/CSDN/正式课程/week2/diabetes/'\n",
    "data = pd.read_csv(dpath +\"diabetes.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 各属性的统计特性\n",
    "data.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# y:outcome 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(data.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of occurrences');\n",
    "# 略微不平衡，尝试欠采样方法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  \n",
       "0                     0.627   50  \n",
       "1                     0.351   31  \n",
       "2                     0.672   32  \n",
       "3                     0.167   21  \n",
       "4                     2.288   33  "
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从原始数据中分离输入特征x和输出y\n",
    "y = data['Outcome'].values\n",
    "X = data.drop(['Outcome'], axis = 1)\n",
    "\n",
    "#用于后续显示权重系数对应的特征\n",
    "columns = X.columns\n",
    "X.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_data = ss_X.fit_transform(X)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 切分训练集测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_data, y, train_size = 0.8,random_state = 123)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练集样本均衡采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#随机欠采样\n",
    "from imblearn.under_sampling import RandomUnderSampler\n",
    "rus = RandomUnderSampler(random_state=0)\n",
    "X_train_resampled, y_train_resampled = rus.fit_sample(X_train, y_train)\n",
    "#smote\n",
    "from imblearn.over_sampling import SMOTE\n",
    "X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr= LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [ 0.41506568  0.48781362  0.58218145  0.55618906  0.54037332]\n",
      "cv logloss is: 0.516324627986\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "#分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "from sklearn.cross_validation import cross_val_score\n",
    "#loss = cross_val_score(lr, X_resampled_smote, y_resampled_smote, cv=5, scoring='neg_log_loss')\n",
    "#loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "loss = cross_val_score(lr, X_train_resampled, y_train_resampled, cv=5, scoring='neg_log_loss')\n",
    "#loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "print('logloss of each fold is: ',-loss)\n",
    "print('cv logloss is:', -loss.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 正则化LR\n",
    "logistic回归的需要调整超参数有：C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "目标函数为：J = sum(logloss(f(xi), yi)) + C* penalty \n",
    "\n",
    "在sklearn框架下，不同学习器的参数调整步骤相同：\n",
    "设置候选参数集合\n",
    "调用GridSearchCV\n",
    "调用fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')\n",
    "grid.fit(X_train_resampled, y_train_resampled)\n",
    "#grid.fit(X_train, y_train)\n",
    "#grid.fit(X_resampled_smote, y_resampled_smote)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 0.00146265,  0.00110216,  0.00065026,  0.00060754,  0.00052314,\n",
       "         0.00049005,  0.00059981,  0.00064712,  0.00065584,  0.00053453,\n",
       "         0.00072355,  0.00065403,  0.00056534,  0.00056901]),\n",
       " 'mean_score_time': array([ 0.00106449,  0.00177636,  0.00135798,  0.00076466,  0.00054388,\n",
       "         0.00059295,  0.00064363,  0.00066729,  0.00070586,  0.00055532,\n",
       "         0.00073667,  0.00065722,  0.00058227,  0.00053701]),\n",
       " 'mean_test_score': array([-0.69314718, -0.66035742, -0.69314718, -0.56824883, -0.52882129,\n",
       "        -0.51669958, -0.5162983 , -0.51632463, -0.51737164, -0.51738475,\n",
       "        -0.51750889, -0.51751583, -0.51752858, -0.51752922]),\n",
       " 'mean_train_score': array([-0.69314718, -0.65884445, -0.69314718, -0.56074158, -0.51418036,\n",
       "        -0.4981772 , -0.491516  , -0.49120858, -0.49105948, -0.49105613,\n",
       "        -0.49105444, -0.49105441, -0.49105439, -0.49105439]),\n",
       " 'param_C': masked_array(data = [0.001 0.001 0.01 0.01 0.1 0.1 1 1 10 10 100 100 1000 1000],\n",
       "              mask = [False False False False False False False False False False False False\n",
       "  False False],\n",
       "        fill_value = ?),\n",
       " 'param_penalty': masked_array(data = ['l1' 'l2' 'l1' 'l2' 'l1' 'l2' 'l1' 'l2' 'l1' 'l2' 'l1' 'l2' 'l1' 'l2'],\n",
       "              mask = [False False False False False False False False False False False False\n",
       "  False False],\n",
       "        fill_value = ?),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'rank_test_score': array([13, 12, 13, 11, 10,  3,  1,  2,  4,  5,  6,  7,  8,  9], dtype=int32),\n",
       " 'split0_test_score': array([-0.69314718, -0.65362475, -0.69314718, -0.53167355, -0.46732674,\n",
       "        -0.43496286, -0.41745971, -0.41506568, -0.41325581, -0.41303912,\n",
       "        -0.41286075, -0.41283951, -0.41282612, -0.41281958]),\n",
       " 'split0_train_score': array([-0.69314718, -0.66292539, -0.69314718, -0.57628084, -0.53777693,\n",
       "        -0.52204401, -0.51652503, -0.51620882, -0.51608967, -0.51608625,\n",
       "        -0.51608492, -0.51608488, -0.51608487, -0.51608487]),\n",
       " 'split1_test_score': array([-0.69314718, -0.66056802, -0.69314718, -0.56574468, -0.52872083,\n",
       "        -0.49927881, -0.49121094, -0.48781362, -0.48712636, -0.48673485,\n",
       "        -0.48665348, -0.48662987, -0.48662416, -0.48661941]),\n",
       " 'split1_train_score': array([-0.69314718, -0.65879233, -0.69314718, -0.56346246, -0.51949218,\n",
       "        -0.50622116, -0.50080377, -0.50054403, -0.50043499, -0.50043142,\n",
       "        -0.5004302 , -0.50043017, -0.50043016, -0.50043016]),\n",
       " 'split2_test_score': array([-0.69314718, -0.66884868, -0.69314718, -0.60704501, -0.57228121,\n",
       "        -0.57870567, -0.58043588, -0.58218145, -0.58343714, -0.5836486 ,\n",
       "        -0.58378834, -0.58382061, -0.58383206, -0.5838381 ]),\n",
       " 'split2_train_score': array([-0.69314718, -0.65404925, -0.69314718, -0.54654414, -0.49725133,\n",
       "        -0.48181779, -0.47517867, -0.47483357, -0.47468397, -0.47468028,\n",
       "        -0.47467861, -0.47467856, -0.47467855, -0.47467855]),\n",
       " 'split3_test_score': array([-0.69314718, -0.65961802, -0.69314718, -0.5712078 , -0.53565264,\n",
       "        -0.54342374, -0.55305504, -0.55618906, -0.55897975, -0.5593153 ,\n",
       "        -0.55963174, -0.55966637, -0.55970112, -0.5597019 ]),\n",
       " 'split3_train_score': array([-0.69314718, -0.65922827, -0.69314718, -0.55752648, -0.50718969,\n",
       "        -0.48844485, -0.48079356, -0.48052328, -0.48035155, -0.48034891,\n",
       "        -0.48034697, -0.48034694, -0.48034692, -0.48034692]),\n",
       " 'split4_test_score': array([-0.69314718, -0.65912763, -0.69314718, -0.56557309, -0.54012501,\n",
       "        -0.52712681, -0.53932995, -0.54037332, -0.54405915, -0.54418587,\n",
       "        -0.54461017, -0.54462277, -0.54465945, -0.54466708]),\n",
       " 'split4_train_score': array([-0.69314718, -0.65922701, -0.69314718, -0.55989397, -0.50919165,\n",
       "        -0.4923582 , -0.48427895, -0.4839332 , -0.48373722, -0.48373379,\n",
       "        -0.48373152, -0.48373148, -0.48373146, -0.48373146]),\n",
       " 'std_fit_time': array([  8.49451951e-04,   5.77865954e-04,   2.49781559e-04,\n",
       "          1.29372819e-04,   9.97760988e-05,   5.39145755e-05,\n",
       "          3.98261520e-05,   9.66787074e-05,   1.03823821e-04,\n",
       "          9.94354690e-05,   1.99380117e-04,   1.01189676e-04,\n",
       "          3.13697247e-05,   9.39050369e-05]),\n",
       " 'std_score_time': array([  3.77967054e-04,   1.23812114e-03,   1.26727628e-03,\n",
       "          2.06963444e-04,   4.89989103e-05,   1.87978498e-04,\n",
       "          8.32949488e-05,   1.38550155e-04,   1.05966220e-04,\n",
       "          8.73056674e-05,   2.96415087e-04,   3.89793888e-05,\n",
       "          7.18695634e-05,   8.35421695e-05]),\n",
       " 'std_test_score': array([ 0.        ,  0.00488945,  0.        ,  0.02393775,  0.03419004,\n",
       "         0.04827429,  0.05726009,  0.05928049,  0.06093109,  0.06114703,\n",
       "         0.0613271 ,  0.06134958,  0.06136521,  0.06137001]),\n",
       " 'std_train_score': array([ 0.        ,  0.00282646,  0.        ,  0.00960723,  0.01375036,\n",
       "         0.01435646,  0.01513914,  0.01514867,  0.01517131,  0.01517124,\n",
       "         0.0151715 ,  0.01517151,  0.01517151,  0.01517151])}"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# view the complete results (list of named tuples)\n",
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.516298304204\n",
      "{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nPgC6+mMFidg6EAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#pd.DataFrame(grid.cv_results_).to_csv('LogisticGridSearchCV_Otto.csv')\n",
    "#cvresult = pd.DataFrame.from_csv('LogisticGridSearchCV_Otto.csv')\n",
    "#test_means = cv_results['mean_test_score']\n",
    "#test_stds = cv_results['std_test_score'] \n",
    "#train_means = cvresult['mean_train_score']\n",
    "#train_stds = cvresult['std_train_score'] \n",
    "\n",
    "\n",
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'neg-logloss' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l1', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#model= LogisticRegression(C= 0.1, penalty='l2')\n",
    "model= LogisticRegression(C= 1, penalty='l1')\n",
    "model.fit(X_train_resampled, y_train_resampled)\n",
    "#model.fit(X_resampled_smote, y_resampled_smote）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 效果评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率 0.747619047619 [ 0.83333333  0.71428571  0.78571429  0.85714286  0.71428571  0.64285714\n",
      "  0.73809524  0.73809524  0.73809524  0.71428571]\n",
      "    0   1\n",
      "0  76  20\n",
      "1  15  43\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#准确率\n",
    "\n",
    "#scores = cross_val_score(model, X_resampled_smote, y_resampled_smote, cv=10)\n",
    "scores = cross_val_score(model, X_train_resampled, y_train_resampled, cv=10)\n",
    "print(\"准确率\", np.mean(scores), scores)\n",
    "\n",
    "\n",
    "#混淆矩阵\n",
    " \n",
    "from sklearn.metrics import confusion_matrix\n",
    "predicted = model.predict(X_test)\n",
    "matrix = confusion_matrix(y_test, predicted)\n",
    "classes = ['0', '1']\n",
    "dataframe = pd.DataFrame(data=matrix,\n",
    "index=classes,\n",
    "columns=classes)\n",
    "print(dataframe)\n",
    " \n",
    "#AUC图\n",
    " \n",
    "from sklearn.metrics import roc_curve, auc\n",
    "predictions = model.predict_proba(X_test)\n",
    "fpr, tpr, thresholds = roc_curve(y_test, predictions[:,1])\n",
    "roc_auc = auc(fpr, tpr)\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(fpr, tpr,'b', label='auc=%0.2f' % roc_auc)\n",
    "plt.legend(loc ='lower right')\n",
    "plt.plot([0, 1],[0,1],'r--')\n",
    "plt.xlim([0.0, 1.0])\n",
    "plt.ylim([0.0, 1.0])\n",
    "plt.xlabel(\"fpr\")\n",
    "plt.ylabel(\"tpr\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n",
      "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
      "          penalty='l1', random_state=None, solver='liblinear', tol=0.0001,\n",
      "          verbose=0, warm_start=False):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.84      0.79      0.81        96\n",
      "          1       0.68      0.74      0.71        58\n",
      "\n",
      "avg / total       0.78      0.77      0.77       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[76 20]\n",
      " [15 43]]\n"
     ]
    }
   ],
   "source": [
    "import sklearn.metrics as metrics\n",
    "#在校验集上测试，估计模型性能\n",
    "y_predict = model.predict(X_test)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (model, metrics.classification_report(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 线性SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_resampled, y_train_resampled)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.83      0.79      0.81        96\n",
      "          1       0.68      0.72      0.70        58\n",
      "\n",
      "avg / total       0.77      0.77      0.77       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[76 20]\n",
      " [16 42]]\n"
     ]
    }
   ],
   "source": [
    "import sklearn.metrics as metrics\n",
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_test)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, metrics.classification_report(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## 线性SVM正则参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train_resampled, y_train_resampled, X_test, y_test):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train_resampled, y_train_resampled)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.7532467532467533\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.7077922077922078\n",
      "accuracy: 0.7597402597402597\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XmYVOWZ9/HvLbK5RSLtBghoWhQ1\nYtIiRtGAUSkXFjERYhZNjMnMq0mcxTET35gYc2UfzRjfTEw0iZkZCMoBUVFEUNEICiguyCLiQovR\nDoqKLG3D/f7xVEnRdHcV3X3q1Kn6fa6rru46darqLtD6cZ5zn+cxd0dERKQtuyVdgIiIlD+FhYiI\nFKSwEBGRghQWIiJSkMJCREQKUliIiEhBCgsRESlIYSEiIgUpLEREpKDdky6gs/Tu3dsHDBiQdBki\nIqmyePHiv7t7TaH9KiYsBgwYwKJFi5IuQ0QkVczslWL20zCUiIgUpLAQEZGCFBYiIlJQxZyzEBGp\ndh988AH19fVs3rx5p8d69OhB37596dq1a7teW2EhIlIh6uvr2XvvvRkwYABm9uF2d2fdunXU19cz\ncODAdr22hqFERCrE5s2b2W+//XYICgAzY7/99mvxiKNYCgsRkQrSPCgKbS+WhqEqyN//Dr/7HWza\nlHQlnaNPH/jc56BXr6QrERGFRYXYtAnOOQcefxw6+A+IspBbGv7b34bzz4evfhVOPbUyPptIGmkY\nqgJs2wZf+hI88QREUbif9ps7LF4MX/kK3HUXjBgBhx8OP/kJvP560n/iIuXLc//SKnJ7sRQWFeDq\nq+GOO+BnP4Nx45KupvN84hNw002wdi3cdhscfDB85zvQrx+MHRtCpKkp6SpFykePHj1Yt27dTsGQ\n64bq0aNHu1/bOpo25aKurs6rcW6oP/wh/Ov70kvhv/6r8odpVq6EW2+FP/4R3ngDDjoILr44/Bkc\ndljS1Ykkqz3XWZjZYnevK/TaCosUmzsXzjwzDNHccw+081qbVPrgg/CZf/97uPfeMHQ1YgRccgmc\ndx504B9QIlWl2LCIdRjKzEaZ2QozW2VmV7Xw+PVmtiR7W2lm67PbR+RtX2Jmm81sbJy1ps3y5TB+\nPAwaBLffXl1BAeHzjh0Ld98Nr74K110HL78MF14Yhqu++U14+umkqxSpHLEdWZhZF2AlcDpQDywE\nJrr7863sfzlwnLt/pdn2jwKrgL7uvrG196umI4uGBjjhBHj//dD9pGU8gm3b4MEH4ZZbYOpUaGyE\nurpwtDFxIuyzT9IVipSfcjiyGAqscvfV7t4ITAbGtLH/RGBSC9vPB+5tKyiqyebN4V/Ur78OM2Yo\nKPLtthucdhr87/+Gk+K/+hVs2QLf+EY4t3HRRfDoo9vbckWkeHGGRR9gTd79+uy2nZhZf2AgMLeF\nhyfQcohUnW3bwsncxx6DP/85HF1Iy/bbb/tQ1BNPwBe+EI42hg+HI4+EX/wC3nwz6SpF0iPOsGip\nL6e1f9NNAO5w9607vIDZQcAxwKwW38DsUjNbZGaLGhoaOlRsGlxzDUyeHK41OP/8pKtJBzM4/nj4\n7W/D0ditt0Lv3vCv/xquEB8/Ppwg37q18GuJVLM4w6Ie6Jd3vy+wtpV9Wzt6+Bwwzd0/aOlJ7n6z\nu9e5e11NTcElZFPtT38KJ3G/+lW48sqkq0mnvfYKR2aPPgrPPw/f+hbMmwdnnRWG8665JpwkF5Gd\nxRkWC4FaMxtoZt0IgTCj+U5mNgjoBcxv4TVaO49RVR56CL72tTAe/5vfVP61FKWQG4p67bVwQePR\nR8MPfwiHHgpnnAFTpoTzHSISxBYW7t4EXEYYQloGTHH3pWZ2rZmNztt1IjDZm7VlmdkAwpHJw3HV\nmAYrVoTrBj72sfClVm0tsnHr1m37UNTLL4ejixUr4IILwjDVP/0TLF2adJUiydNFeWXs73+HYcPg\n3XdDi2w71yyRXbR1KzzwQGjBnT49XAA4bFhowb3ggjCcJVIpyqF1Vjpgy5Ywz1N9Pdx5p4KilLp0\nCVfGT5kShql++Ut4550QFgcdFH4uWKAWXKkuCosy5B7mOnr00TCB3oknJl1R9aqp2T4U9dhjYX2N\nSZPC38kxx8ANN4QjQJFKp7AoQz/4Qbiw7Ec/Cl9OkjyzEBC33BJacG++OQxHXXFFOLdxwQUwe3a4\nFkakEiksysx//3cIi4suCtNxS/nZZ5/QnbZgATzzDPzDP4RzHGecEbqprr0W1qwp/DoiaaKwKCOP\nPBKuoxgxIlxEphbZ8pcbinrttXDBZG1t6Kjq3z9cvxFFYY4qkbRTN1SZeOGF0HFTUwPz52vd6TR7\n6aVwpfgf/hBCZP/9w3UclaB797AglRouKofWs0iRdevCePjbb4ehDS3iUxm2boVZs8LV92tbm7sg\nZf7613DkdM01SVcinUVhkRJbtoSx7gULwmJGJ52UdEUirRs2LPxcsCDZOqTz6DqLFHAPJ0rnzQvL\nhCoopNxlMmEWX7ULVx+FRYKuuy5MNX7ttWFxHpFyl8mEf+Tcf3/SlUipKSwSMmkSfO978KUvwdVX\nJ12NSHHq6sIU7/fem3QlUmoKiwT89a/hOopTTgkXd6lFVtJit93CVCizZukCxGqjsCixF18My6L2\n7x968Lt3T7oikV2TyYR14BcvTroSKSWFRQm9/TacfXb4F9k994SlP0XS5swzw9GwhqKqi8KiRBob\nw7oUL70Upr2urU26IpH26d07LFWrsKguCosScIevfz2seHfLLTB8eNIViXRMJhPWWFm3LulKpFQU\nFiXw4x+H6yiuuQa+8IWkqxHpOLXQVh+FRcz+8hf47nfhwgs1RYJUjrq6cM5NQ1HVQ2ERo/nz4ctf\nhpNPDsNPapGVSpFbTfC++9RCWy0UFjFZvRrGjIG+fWHaNLXISuXJtdA++WTSlUgpKCxisH59aJFt\naoKZM0P3iEilUQttdYk1LMxslJmtMLNVZnZVC49fb2ZLsreVZrY+77FDzOx+M1tmZs+b2YA4a+0s\nH3wA558fLr6bNg0OPzzpikTiUVMTzl0oLKpDbGFhZl2Am4AMMBiYaGaD8/dx9yvcfYi7DwFuBKK8\nh28Dfu7uRwJDgTfjqrWzuIclNufMgd//Hk49NemKROKVa6F9662kK5G4xXlkMRRY5e6r3b0RmAyM\naWP/icAkgGyo7O7uswHcfYO7b4yx1k7xs5+FE9lXXx0mCBSpdJlMOMGtFtrKF2dY9AHyl62vz27b\niZn1BwYCc7ObDgfWm1lkZk+Z2c+zRypl64474KqrYMKEMOW4SDU4/ni10CZtw4YwqhG3OMOipUbR\n1j7SBOAOd9+avb87MBz4F+B44FDgop3ewOxSM1tkZosaGho6XnE7Pf44fPGL8KlPhXWX1SIr1aJL\nl7DSo1pok3PxxWEG67jFGRb1QL+8+32B1lYinkB2CCrvuU9lh7CagOnAJ5o/yd1vdvc6d6+rqanp\npLJ3zcsvw+jRcPDBYc6nHj0SKUMkMZkMvPkmPPVU0pVUn02bQsflMcfE/15xhsVCoNbMBppZN0Ig\nzGi+k5kNAnoB85s9t5eZ5RJgJPB8jLW2yzvvhBbZxsYwi2xCeSWSqDPPDD81FFV6998PGzeGSUrj\nFltYZI8ILgNmAcuAKe6+1MyuNbPRebtOBCa7bx91yw5H/Qswx8yeJQxp/S6uWtvjgw/gs5+FlSth\n6lQ44oikKxJJxv77q4U2KVEEvXqVpvNy9zhf3N1nAjObbftes/vfb+W5s4GPx1ZcB7jDZZfB7Nlw\n660wcmTSFYkkK5OBH/0otNB+9KNJV1MdGhthxowwU0TXrvG/n67gbodf/jIsh/qd74STSyLVLtdC\nO3t20pVUj4ceCrNFlGIIChQWu2zaNLjyyjAEdd11SVcjUh6GDg1HFBqKKp0ogj33hNNPL837KSx2\nwcKFYarxE06AP/0pLF4vImqhLbWtW0P35VlnQc+epXlPfd0V6dVXQ4vsAQfAnXeW7i9IJC0yGXjj\nDViyJOlKKt/8+eHPulRDUKCwKMq774YW2U2bQovs/vsnXZFI+VELbelEEXTrFr6XSkVhUUBTE1xw\nASxfHqb0GDy48HNEqtEBB8AnP6mwiJt7CIszzoC99y7d+yos2uAO3/xmGIf9zW/gM59JuiKR8pbJ\nhCGSt99OupLK9dRT8MorpR2CAoVFm264IYTElVfCJZckXY1I+VMLbfymTg0NBeeeW9r3VVi04s47\n4Z//GcaPhx//OOlqRNLhhBPCFcUaiopPFIUrtku9AqfCogWLF8PnPx+mX77tNrXIihRLLbTxWrYs\nnD8t9RAUKCx2smZNOLzr3TscXeyxR9IViaRLJgN/+xs8/XTSlVSeKLuW6NixpX9vhUWe996Dc86B\n998PLbIHHph0RSLpM2pU+KmhqM4XRTBsGPRpcRm5eCksspqawip3S5fC7bfD0UcnXZFIOh1wAHzi\nEwqLzvbyy/Dkk8kMQYHC4kNXXBEWEbnppjDmKiLtl2uhXb8+6Uoqx7Rp4afCIkH/+Z/w61+H7qev\nfz3pakTSL5MJ8xephbbzRBEceywcdlgy71/1YbF8eTiqGDsWfvrTpKsRqQwnnAD77quhqM7yt7/B\nX/+a3FEFxLz4URoccQT85S/hX0JduiRdjUhl2H337S207mCWdEXpNn16+HNMMiyq/sgC4Pzzw7zw\nItJ5Mhl4/XW10HaGKILaWjjqqORqUFiISCzUQts53noLHnwwHFUkeYSmsBCRWBx4IBx3nMKio+6+\nO7T2JzkEBQoLEYlRJgOPPaYW2o6IIujbF+rqkq1DYSEiscm10D7wQNKVpNOGDTBrVjiqSHqOuljf\n3sxGmdkKM1tlZle18Pj1ZrYke1tpZuvzHtua99iMOOsUkXgMG6YW2o647z7YvDn5ISiIsXXWzLoA\nNwGnA/XAQjOb4e7P5/Zx9yvy9r8cOC7vJTa5+5C46hOR+O2+O5x+ulpo2yuKoKYGTj456UriPbIY\nCqxy99Xu3ghMBsa0sf9EYFKM9YhIAjIZWLsWnnkm6UrSZcuWcHJ7zJjyuAYszrDoA6zJu1+f3bYT\nM+sPDATm5m3uYWaLzGyBmbU4Ia+ZXZrdZ1FDQ0Nn1S0inUgttO3zwANhJuxyGIKCeMOipQNOb2Xf\nCcAd7r41b9sh7l4HfB64wcx2mhHF3W929zp3r6upqel4xSLS6Q46CIYMUVjsqiiCffaBkSOTriSI\nMyzqgX559/sCa1vZdwLNhqDcfW3252rgIXY8nyEiKZLJhLmN3nkn6UrSoakpLL52zjnQvXvS1QRx\nhsVCoNbMBppZN0Ig7NTVZGaDgF7A/Lxtvcyse/b33sBJwPPNnysi6aAW2l3zyCOwbl35DEFBjGHh\n7k3AZcAsYBkwxd2Xmtm1ZjY6b9eJwGR3zx+iOhJYZGZPAw8CP8nvohKRdDnxRPjIRzQUVawogp49\nt5/vKQe243d0etXV1fmiRYuSLkNEWvHZz4YFkdasUQttW7Ztg0MOgaFDt6+5HSczW5w9P9wmXcEt\nIiWRycBrr8GzzyZdSXlbuDD8OZXTEBQoLESkRNRCW5woChcznnNO0pXsSGEhIiVx8MFhWVCFRevc\nYepUOO20ME1KOVFYiEjJjBoVWmjffTfpSsrTs8/Ciy+W3xAUFBkWZjbVzM42M4WLiLRbJhOuIVAL\nbcuiKJz8H9PWxEgJKfbL/zeEK6lfMLOfmNkRMdYkIhXqU58KVyVrKKplURQmDTzggKQr2VlRYeHu\nD7j7hcAngJeB2Wb2mJldbGZd4yxQRCpH167wmc+EsKiQrv1O88ILYRhq/PikK2lZ0cNKZrYfcBFw\nCfAU8CtCeMyOpTIRqUi5Ftrnnku6kvIybVr4OW5csnW0pthzFhHwCLAHcK67j3b3v7j75cBecRYo\nIpVFLbQti6KwdOohhyRdScuKPbL4tbsPdvcfu/vr+Q8Uc+WfiEhO375wzDEKi3z19fD44+XZBZVT\nbFgcaWYfdv1mJ/r7x5hqEpEKl8nAo4+qhTYnNwRVCWHxNXf/cH1sd38b+Fo8JYlIpcu10M6Zk3Ql\n5SGKYPBgGDQo6UpaV2xY7Ga2feqv7Pra3eIpSUQq3Uknwd57aygKoKEB5s0r76MKgN2L3G8WMMXM\n/ouw2t03gPtiq0pEKlrzFtpqnoV2xoww02y5h0WxRxb/Rlgf+x+A/wPMAa6MqygRqXyZTDixu3Rp\n0pUkK4pgwICw9Gw5K+rIwt23Ea7i/k285YhItchkws9774Wjj062lqS8806Y+uTyy8v/6KrY6yxq\nzewOM3vezFbnbnEXJyKVq2/fEBLVfN5i5kxobCz/ISgofhjqD4SjiiZgBHAb8Oe4ihKR6pBroX3v\nvaQrSUYUwYEHwrBhSVdSWLFh0dPd5xCWYX3F3b8PjIyvLBGpBpkMfPBBdbbQbtwYjizGjYPdUjCf\nd7Elbs5OT/6CmV1mZuOA/WOsS0SqwEknwV57VedQ1P33h8BIwxAUFB8W3ybMC/VN4JPAF4Avx1WU\niFSHbt2qdxbaKIJeveDUU5OupDgFwyJ7Ad7n3H2Du9e7+8XuPt7dFxTx3FFmtsLMVpnZVS08fr2Z\nLcneVprZ+maP72Nmr5nZr3fpU4lIamQysGYNPP980pWUTmMj3HUXjB4drjlJg4Kts+6+1cw+aWbm\nXnz2Z0PmJuB0oB5YaGYz3P3D/yTc/Yq8/S8Hjmv2Mj8EHi72PUUkffJbaI86KtlaSuWhh2D9+vQM\nQUHxw1BPAXea2RfN7LzcrcBzhgKr3H21uzcCk4G2FgucCEzK3TGzTwIHAPcXWaOIpFC/fiEkqum8\nRRTBnnvCGWckXUnxig2LjwLrCB1Q52Zv5xR4Th9gTd79+uy2nZhZf2Ag4SpxsifTfwn8a5H1iUiK\nZTLwyCPV0UK7dStMnw5nnw09eiRdTfGKvYL74na8dkvXI7Y2jDUBuMPdt2bv/yMw093XWBuXNZrZ\npcClAIeU64ohIlJQJgO/+AXMnQtj2hp/qADz58Mbb6RrCAqKDAsz+wMtfNG7+1faeFo90C/vfl9g\nbSv7TiDMOZVzIjA8u2bGXkA3M9vg7jucJHf3m4GbAerq6qqsl0Kkcpx88vYW2koPiygKXWBnnZV0\nJbum2Fln7877vQcwjta/+HMWArVmNhB4jRAIn2++k5kNAnoB83Pb3P3CvMcvAuqaB4WIVI5u3eC0\n0yp/Flr3EBZnnBGmaE+Tos5ZuPvUvNv/AJ8D2pz6y92bgMsI05svA6a4+1Izu9bMRuftOhGYvCud\nViJSeTIZePVVWLYs6Uri8+ST8Mor6RuCguKPLJqrBQqeJHD3mcDMZtu+1+z+9wu8xh+BP+5qgSKS\nLvkttIMHJ1tLXKIIunSBc89NupJdV+yss++Z2bu5G3AXYY0LEZFOccghISQquYU2isIV2717J13J\nriu2Gyplo2sikkaZDNx4I2zYEE54V5Jly2D58rB2RRoVe2Qxzsw+knd/XzMbG19ZIlKNMpkwFcbc\nuUlX0vmiKPwcm9JvzmIvyrvG3d/J3XH39cA18ZQkItXq5JPDlc2VOBQVRXDiiXDwwUlX0j7FhkVL\n+7X35LiISIu6d9+xhbZSvPxy6IRKYxdUTrFhscjM/sPMDjOzQ83semBxnIWJSHXKZEJ76fLlSVfS\neXJDUOPGJVtHRxQbFpcDjcBfgCnAJna84lpEpFPkt9BWiiiCY4+Fww5LupL2K/aivPfd/Sp3r8ve\n/t3d34+7OBGpPv37w5FHVk5YvP46PPZYuoegoPhuqNlmtm/e/V5mNiu+skSkmmUyMG9eaKFNuzvv\nDOdfqiIsgN7ZDigA3P1ttAa3iMQk10L74INJV9JxUQS1telf2KnYsNhmZh9O72FmA2h9unERkQ4Z\nPrwyWmjfeisE3vjx6Z8csdj21+8Cj5pZbonTU8iuIyEi0tm6d4eRI9M/C+3dd0NTU/qHoKD4E9z3\nAXXACkJH1D8TOqJERGKRyYTrE1asSLqS9osi6NsX6uqSrqTjil386BLgW4QFjJYAwwjrT4yMrzQR\nqWb5LbRHHJFsLe2xYQPMmgWXXpreI6N8xZ6z+BZwPPCKu48AjgMaYqtKRKregAEhJNJ63uLee2Hz\n5soYgoLiw2Kzu28GMLPu7r4cGBRfWSIi4eji4Yfh/RRe1RVFUFMT5ruqBMWGRX32OovpwGwzu5PC\ny6qKiHRIWltoN28OJ7fHjAmLHVWCYtezyM1o8n0zexD4CHBfbFWJiACnnAJ77BGGdM45J+lqijdn\nTjhnUSlDUNCOmWPd/eHCe4mIdFxaW2ijCPbZJ8ygWymKHYYSEUlEJgMvvQQrVyZdSXGamsIUH+ee\nC926JV1N51FYiEhZS9sstI88AuvWVdYQFCgsRKTMDRwIgwalJyyiCHr2hDPPTLqSzhVrWJjZKDNb\nYWarzOyqFh6/3syWZG8rzWx9dnt/M1uc3b7UzL4RZ50iUt5yLbQbNyZdSdu2bQthMWpUmNuqksQW\nFmbWBbgJyACDgYlmNjh/H3e/wt2HuPsQ4EYgu54UrwOfym4/AbjKzFK6cq2IdFQmA1u2lH8L7RNP\nwNq1lTcEBfEeWQwFVrn7andvBCYDY9rYfyIwCcDdG919S3Z795jrFJEyl99CW86iCHbfPV1tvsWK\n80u4D7Am7359dttOzKw/MBCYm7etn5k9k32Nn7r7ThcBmtmlZrbIzBY1NGj2EZFK1aMHjBixvYW2\nHLmHsDjtNNh338L7p02cYdFSR3Rrf80TgDvcfeuHO7qvcfePAx8DvmxmB+z0Yu4355Z6ramp6ZSi\nRaQ8ZTKwejW88ELSlbTs2WfhxRfD2hWVKM6wqAf65d3vS+tThEwgOwTVXPaIYikwvFOrE5FUKfcW\n2igKFw2OaWuwPcXiDIuFQK2ZDTSzboRAmNF8JzMbBPQiTHme29bXzHpmf+8FnERYS0NEqtShh8Lh\nh5d3WAwfDvtX6ILTsYWFuzcBlwGzgGXAFHdfambXmtnovF0nApPddxiJPBJ43MyeBh4GfuHuz8ZV\nq4ikQyYDDz1Ufi20L7wQhqEqsQsqZ5fnhtoV7j4TmNls2/ea3f9+C8+bDXw8ztpEJH0yGfjVr0Jg\nnHVW0tVsF2Wb/seNa3u/NFNLqoikxqmnhqujy20oKorC0qmHHJJ0JfFRWIhIauS30JaLNWvCxXiV\nPAQFCgsRSZlMJrSolksL7fTp4afCQkSkjJRbC20UwVFHhckOK5nCQkRS5bDDoLa2PMKioQHmzav8\nowpQWIhICuVaaDdtSraOGTPCTLMKCxGRMpTJwObNITCSFEVhvY1jj022jlJQWIhI6px6auiMSnIo\n6p134IEHwlFFWtYG7wiFhYikTs+eybfQ3nMPNDZWxxAUKCxEJKUyGVi1KtySEEVw4IEwbFgy719q\nCgsRSaUkW2g3bgzvO24c7FYl36JV8jFFpNJ87GPhlkRY3H9/CIxqGYIChYWIpFgmE9blLnULbRTB\nRz8aTrRXC4WFiKRWroX24YdL956NjXDXXTB6NHTtWrr3TZrCQkRS69OfLn0L7UMPwfr11TUEBQoL\nEUmxnj1DYJQyLKII9twTTj+9dO9ZDhQWIpJqmUyYgfbFF+N/r61bYdo0OPvscERTTRQWIpJqpWyh\nfewxePPN6huCAoWFiKRcbW2YibYUYRFF0K1beS3pWioKCxFJvVwL7ebN8b2HewiLM86AvfeO733K\nlcJCRFIvkwnXWsTZQvvkk/DqqzB+fHzvUc5iDQszG2VmK8xslZld1cLj15vZkuxtpZmtz24fYmbz\nzWypmT1jZhfEWaeIpNunPw3du8c7FBVF0KULnHtufO9RzmILCzPrAtwEZIDBwEQzG5y/j7tf4e5D\n3H0IcCMQZR/aCHzJ3Y8CRgE3mNm+cdUqIum2xx7xt9BGUXiP/faL7z3KWZxHFkOBVe6+2t0bgcnA\nmDb2nwhMAnD3le7+Qvb3tcCbQE2MtYpIymUysHIlrF7d+a+9bBksX16dXVA5cYZFH2BN3v367Lad\nmFl/YCAwt4XHhgLdgBJ0UYtIWsXZQjt1avg5dmznv3ZaxBkWLa0d5a3sOwG4w9237vACZgcBfwYu\ndvdtO72B2aVmtsjMFjU0NHS4YBFJr9paOPTQeMIiiuDEE+Hggzv/tdMizrCoB/rl3e8LrG1l3wlk\nh6ByzGwf4B7gandf0NKT3P1md69z97qaGo1SiVQzs3B0MXdu57bQvvQSPPVUdQ9BQbxhsRCoNbOB\nZtaNEAgzmu9kZoOAXsD8vG3dgGnAbe5+e4w1ikgFybXQzpvXea85bVr4qbCIibs3AZcBs4BlwBR3\nX2pm15rZ6LxdJwKT3T1/iOpzwCnARXmttUPiqlVEKsOIEZ3fQhtFMGRIGOKqZrbjd3R61dXV+aJF\ni5IuQ0QSduaZ8MoroXupo15/Hfr0gR/8AP7v/+3465UjM1vs7nWF9tMV3CJSUTIZWLEinGvoqDvv\nDNN8VPsQFCgsRKTCdGYLbRTB4YfD4MGF9610CgsRqSiHHw4DB3Y8LN56K0xOeN55odOq2iksRKSi\ndFYL7V13QVOThqByFBYiUnEyGdi4ER55pP2vEUXQty/UFTz1Wx0UFiJScUaMCIsUtXcoasMGmDVL\nQ1D5FBYiUnH23BNOPbX9YXHvvbBli4ag8iksRKQiZTLhWouXX97150YR1NTAySd3elmppbAQkYrU\n3hbazZvh7rvDDLNdunR+XWmlsBCRijRoEAwYsOthMWdOOGehIagdKSxEpCLlt9Bu2VL886II9tkH\nRo6Mr7Y0UliISMXKZOD994tvoW1qClN8nHtu6KaS7RQWIlKxRo7ctRbaefNg3ToNQbVEYSEiFWvP\nPeGUU4oPiyiCnj3DzLWyI4WFiFS0TAaWLQvTlrdl27aw0NGoUSFkZEcKCxGpaMW20D7xBKxdC+PH\nx19TGiksRKSiHXEE9O9fOCyiCLp2hbPPLk1daaOwEJGKlmuhnTOn9RZa9xAWp50G++5b2vrSQmEh\nIhUv10L76KMtP/7ss/Dii+qCaovCQkQqXqEW2igKRyBjxpS2rjRRWIhIxdtrLxg+vPWwmDo1PL7/\n/qWtK00UFiJSFTIZeP55ePWbJzR6AAAHkUlEQVTVHbevXAnPPachqEJiDQszG2VmK8xslZld1cLj\n15vZkuxtpZmtz3vsPjNbb2Z3x1mjiFSH1lpop00LP8eNK209aRNbWJhZF+AmIAMMBiaa2eD8fdz9\nCncf4u5DgBuBKO/hnwNfjKs+EakuRx4Jhxyyc1hEERx/fHhMWhfnkcVQYJW7r3b3RmAy0Nbpo4nA\npNwdd58DvBdjfSJSRfJbaBsbw7Y1a8LFeBqCKizOsOgDrMm7X5/dthMz6w8MBObuyhuY2aVmtsjM\nFjU0NLS7UBGpDplMWKsi10I7fXr4qbAoLM6waGmZc29l3wnAHe6+dVfewN1vdvc6d6+rqanZ5QJF\npLqMHBmu0s4NRUURHHUUHH54snWlQZxhUQ/0y7vfF1jbyr4TyBuCEhGJw957b2+hbWgIU5LrqKI4\ncYbFQqDWzAaaWTdCIMxovpOZDQJ6AfNjrEVEBAhDUUuXwq9/HWaaVVgUJ7awcPcm4DJgFrAMmOLu\nS83sWjMbnbfrRGCyu+8wRGVmjwC3A6eZWb2ZaYZ5EemwXAvtT38KAwfCsccmW09a7B7ni7v7TGBm\ns23fa3b/+608d3h8lYlItRo8GPr1C51Q550XuqSkMF3BLSJVJddCC1q7YlfEemQhIlKOrrgCamrg\nhBOSriQ9FBYiUnWOOAKuuy7pKtJFw1AiIlKQwkJERApSWIiISEEKCxERKUhhISIiBSksRESkIIWF\niIgUpLAQEZGCrNn8fallZg3AKx14id7A3zupnCRVyucAfZZyVSmfpVI+B3Tss/R394ILAlVMWHSU\nmS1y97qk6+ioSvkcoM9Srirls1TK54DSfBYNQ4mISEEKCxERKUhhsd3NSRfQSSrlc4A+S7mqlM9S\nKZ8DSvBZdM5CREQK0pGFiIgUpLDIMrMfmtkzZrbEzO43s4OTrqm9zOznZrY8+3mmmdm+SdfUXmb2\nWTNbambbzCx1nStmNsrMVpjZKjO7Kul6OsLMbjWzN83suaRr6Qgz62dmD5rZsux/W99Kuqb2MrMe\nZvaEmT2d/Sw/iO29NAwVmNk+7v5u9vdvAoPd/RsJl9UuZnYGMNfdm8zspwDu/m8Jl9UuZnYksA34\nLfAv7r4o4ZKKZmZdgJXA6UA9sBCY6O7PJ1pYO5nZKcAG4DZ3PzrpetrLzA4CDnL3J81sb2AxMDaN\nfy9mZsCe7r7BzLoCjwLfcvcFnf1eOrLIygVF1p5AalPU3e9396bs3QVA3yTr6Qh3X+buK5Kuo52G\nAqvcfbW7NwKTgTEJ19Ru7j4PeCvpOjrK3V939yezv78HLAP6JFtV+3iwIXu3a/YWy3eXwiKPmf3I\nzNYAFwLfS7qeTvIV4N6ki6hSfYA1effrSemXUqUyswHAccDjyVbSfmbWxcyWAG8Cs909ls9SVWFh\nZg+Y2XMt3MYAuPt33b0f8D/AZclW27ZCnyW7z3eBJsLnKVvFfJaUsha2pfaItdKY2V7AVODbzUYW\nUsXdt7r7EMIIwlAzi2WIcPc4XrRcuftnitz1f4F7gGtiLKdDCn0WM/sycA5wmpf5iald+HtJm3qg\nX979vsDahGqRPNnx/anA/7h7lHQ9ncHd15vZQ8AooNObEKrqyKItZlabd3c0sDypWjrKzEYB/waM\ndveNSddTxRYCtWY20My6AROAGQnXVPWyJ4VvAZa5+38kXU9HmFlNrtvRzHoCnyGm7y51Q2WZ2VRg\nEKHz5hXgG+7+WrJVtY+ZrQK6A+uymxakuLNrHHAjUAOsB5a4+5nJVlU8MzsLuAHoAtzq7j9KuKR2\nM7NJwKcJM5y+AVzj7rckWlQ7mNnJwCPAs4T/3wH+3d1nJldV+5jZx4E/Ef772g2Y4u7XxvJeCgsR\nESlEw1AiIlKQwkJERApSWIiISEEKCxERKUhhISIiBSksRHaBmW0ovFebz7/DzA7N/r6Xmf3WzF7M\nzhg6z8xOMLNu2d+r6qJZKW8KC5ESMbOjgC7uvjq76feEiflq3f0o4CKgd3bSwTnABYkUKtIChYVI\nO1jw8+wcVs+a2QXZ7buZ2f/LHincbWYzzez87NMuBO7M7ncYcAJwtbtvA8jOTntPdt/p2f1FyoIO\nc0Xa5zxgCHAs4YrmhWY2DzgJGAAcA+xPmP761uxzTgImZX8/inA1+tZWXv854PhYKhdpBx1ZiLTP\nycCk7IyfbwAPE77cTwZud/dt7v434MG85xwENBTz4tkQacwuziOSOIWFSPu0NP14W9sBNgE9sr8v\nBY41s7b+H+wObG5HbSKdTmEh0j7zgAuyC8/UAKcATxCWtRyfPXdxAGHivZxlwMcA3P1FYBHwg+ws\nqJhZbW4NDzPbD2hw9w9K9YFE2qKwEGmfacAzwNPAXODK7LDTVMI6Fs8R1g1/HHgn+5x72DE8LgEO\nBFaZ2bPA79i+3sUIIHWzoErl0qyzIp3MzPZy9w3Zo4MngJPc/W/Z9QYezN5v7cR27jUi4DspXn9c\nKoy6oUQ6393ZBWm6AT/MHnHg7pvM7BrCOtyvtvbk7EJJ0xUUUk50ZCEiIgXpnIWIiBSksBARkYIU\nFiIiUpDCQkREClJYiIhIQQoLEREp6P8DEfH/VMbP13wAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train_resampled, y_train_resampled, X_test, y_test)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier SVC(C=10, cache_size=200, class_weight=None, coef0=0.0,\n",
      "  decision_function_shape='ovr', degree=3, gamma=1e-05, kernel='rbf',\n",
      "  max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
      "  tol=0.001, verbose=False):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.82      0.73      0.77        96\n",
      "          1       0.62      0.74      0.68        58\n",
      "\n",
      "avg / total       0.75      0.73      0.74       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[70 26]\n",
      " [15 43]]\n"
     ]
    }
   ],
   "source": [
    "SVC2 =  LinearSVC( C = 0.01)\n",
    "SVC2 = SVC3.fit(X_train_resampled, y_train_resampled)\n",
    "\n",
    "import sklearn.metrics as metrics\n",
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC2.predict(X_test)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC2, metrics.classification_report(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LR与线性SVM比较\n",
    "在验证集上二者性能基本一致，在对y=0的预测上LR效果更好一点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优\n",
    "\n",
    "RBF核是SVM最常用的核函数。\n",
    "RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma\n",
    "C越小，决策边界越平滑； \n",
    "gamma越小，决策边界越平滑。\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_test, y_test）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train_resampled, y_train_resampled, X_test, y_test):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train_resampled, y_train_resampled)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.7142857142857143\n",
      "accuracy: 0.7402597402597403\n",
      "accuracy: 0.564935064935065\n",
      "accuracy: 0.6298701298701299\n",
      "accuracy: 0.38961038961038963\n",
      "accuracy: 0.7532467532467533\n",
      "accuracy: 0.7467532467532467\n",
      "accuracy: 0.564935064935065\n",
      "accuracy: 0.6298701298701299\n",
      "accuracy: 0.38961038961038963\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7597402597402597\n",
      "accuracy: 0.7012987012987013\n",
      "accuracy: 0.5\n",
      "accuracy: 0.38961038961038963\n",
      "accuracy: 0.7922077922077922\n",
      "accuracy: 0.7272727272727273\n",
      "accuracy: 0.6753246753246753\n",
      "accuracy: 0.512987012987013\n",
      "accuracy: 0.3961038961038961\n",
      "accuracy: 0.7467532467532467\n",
      "accuracy: 0.7142857142857143\n",
      "accuracy: 0.6753246753246753\n",
      "accuracy: 0.512987012987013\n",
      "accuracy: 0.3961038961038961\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train_resampled, y_train_resampled, X_test, y_test)\n",
    "        accuracy_s.append(tmp)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7142857142857143\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7142857142857143\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7142857142857143\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7142857142857143\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.8051948051948052\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7597402597402597\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.7597402597402597\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7597402597402597\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.7402597402597403\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7207792207792207\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7922077922077922\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7532467532467533\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.4090909090909091\n",
      "accuracy: 0.7012987012987013\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7662337662337663\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.7792207792207793\n",
      "accuracy: 0.7727272727272727\n",
      "accuracy: 0.7402597402597403\n",
      "accuracy: 0.6883116883116883\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-5, 5, 10)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-10, -2, 10)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma,X_train_resampled, y_train_resampled, X_test, y_test)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n1atX4+3tTe3atXnvvfcA2LdvH4899hheXl6ICFOnTqVZM/v0N8OGDePChQtkZmbSpk0bZs60x8Ut\nXryYd999Fx8fHypXrsySJUsAe4Pg7DHYbDZGjBhB7969AQp8LGBP7n3ggQdISUnB19fXutxX5c2j\nQYLFSYMEVV40olzlR3l7X+U3SFBPQ6lyY+rUqbRu3ZpWrVrRrFkztxHlACtXriQsLIzg4GC2bt3K\npEnZLtgrERpRrkqS9ixuYuXtG5BSxaG8va+0Z6GUUqrIaGOhlFIqT9pYKKWUypM2FkoppfKkjYUq\nEhpR7nm5RZQ7HT58mKpVq7pNggX7zXDPPPMMf/jDH2jRogVvvvmm9dz69esJDQ0lKCiIXr16WeXn\nz59n8ODBNG/enBYtWrB9+3brublz59KsWTNatmyZJTNq165dREREEBQUREhICBkZGUDuEeExMTG0\nbNmSoKAgHnjgAav8yJEj9O7dm5YtW9KyZUuOHz9eqGPZv3+/9f8yLCyM6tWrFzoduVwSkTLxEx4e\nLuXN/v37S7oK2XzwwQfy+OOPF3r94cOHyxdffFHg9Tp37iw7d+4s1D6vXr0qrVq1EpvNVqj1i8u6\ndevk0UcfzXWZQYMGyT333CNz5851+/z8+fNl1KhRkpmZKSIi//vf/0REJDk5WVq0aCHHjx/PUi4i\nct9998kHH3wgIiLp6ely8eJFERFZs2aNREZGypUrV7Ksc/XqVQkODpbdu3eLiMjZs2fl2rVrIiIy\nefJkefbZZ0VE5Nq1a3Lu3DkREUlISJA2bdrIhQsXsu2/S5cusn79ehERuXTpkvz222+FPhanjIwM\nqVu3rrWMq9L4vvIkIE7y8RmrPQvlcRpRbj8OT0eUf/bZZzRv3jzXuUDefvttpk2bhjH2iSx9fX2t\n12zIkCH4+/tnKT9//jzbtm1j5MiRgD12xXk39Ntvv82kSZOsO9md66xevZrw8HBCQuzB0XXq1MHL\ny/5Rk1NE+Pz58/nrX/9qzVnh3Nbu3bvx9va2egfVqlWjcuXKhToWV2vWrKFFixbWMipvGvdRRlz8\nz0Gunkor0m1WvL0qNftnm822QDSivHgiyi9dusScOXNYt24dL7/8co6vz+HDh/n4449Zvnw5vr6+\nvP766zRp0oTExESMMXTv3p20tDSeeOIJ7r//fg4dOkTdunV54IEH2LNnD+3atWPevHlUqVKFxMRE\nNm7cyNNPP03lypWZM2cO4eHhJCYmIiJERkZy7tw5hg8fzoQJE3KNCE9MTMTHx4fOnTuTmZnJ888/\nT2RkJImJidx6660MGjSIo0ePEhkZycsvv4yXl1eBj8XV4sWLuffeewv1f6y80p6F8iiNKC+eiPKp\nU6cyceLEPF/HK1euUL16deLi4hg5ciQPPfQQYM9dio+PZ/Xq1axevZrnnnuOgwcPYrPZiIuLY9y4\nccTHx1OxYkVmz55trZOSksK2bdt4+eWXGTp0qFX+/fffExMTw+bNm1myZAmxsbG5RoTbbDYOHTpE\nbGwsH3/8MX/+85/59ddfsdlsbN68mXnz5rF9+3Z+/vlnK8G4oMfi+hqsWrUqy/8BlTeP9iyMMX2B\n1wBvYIGIzLzu+ZHAbOzTrgK8ISILHM89CExxlL8kIh96sq43uxvtAXiKaER5sUSUb9++neXLl/O3\nv/2NixcvWtsfM2ZMlmPw8/PjnnvuAeCee+7hkUceAewBjP7+/lSpUoUqVarQuXNndu/eTbt27WjU\nqBFt27a11nEOnvv7+1vb6tixIxkZGVy4cAF/f3969OhhnWLq168f8fHxdO3aNceIcOc6FSpUoEmT\nJjRp0oSDBw/i7+9PeHi4FSg5aNAg4uPjefDBBwt8LE2a2N8jq1atokOHDlki1lXePNazMMZ4A28C\n/YCWwL3GGHd5wEtEJMzx42wobgOeBToA7YFnHfNyq5uMRpQXTGEjyrds2cKRI0c4cuQIY8eOZdq0\nadkaCrB/2H777beAPZ3VOb4xaNAgNm3axLVr10hLS2P79u00b94cf39/fH19rdfHNdbbdVsJCQkA\n1KpVi379+rFz504uX76MzWZj06ZNVg8qp4jwQYMGsWHDBsB+6vLgwYM0btyYiIgIzpw5Q3JyMgDf\nfvut2/3n51icYmJi9BRUIXiyZ9EeSBKRQwDGmMXAQCA/c2n3AdaKyHnHumuBvkCMh+qqPEQjygum\nsBHluenTpw+LFi3C19eXyZMnM3z4cGbPnk316tWZP38+AMHBwfTq1YuQkBC8vLx47LHHrHyk119/\nnaFDh5KRkUGTJk1YuHAhYJ9waOTIkQQHB3PLLbfw0UcfAfbAw3HjxhEeHo6Xlxf9+/e3TsvlFBEe\nFRXF2rVradmyJRUqVGDu3LnWYPfs2bPp2bMnIkL79u2tiPTCHEtqaiobNmzQaPLCyM8lU4X5AaKx\nn3pyPh6B/TST6zIjgV+A3cBnQANH+VPAFJflpgJP5bY/vXRW5eXSpUsiYr+0s1+/frJy5Urruf79\n+8vBgwezLCci8tJLL8nf/va34q1oDmbNmiULFy4s6WqUeeXtfUUpuHTWuGubrnv8HyBARFoB6wDn\nuER+1sUY87AxJs4YE3f27Nkbqqwq+zSiXKnC81hEuTGmI/CciPRxPJ4EICJur+tzjHGcF5Eaxph7\ngR4i8ojjuXeAjSKS42kojShXShWF8va+Kg0R5T8CTY0xjY0xFYFhwErXBYwx9V0eDgASHL9/A0Qa\nY2o5BrYjHWVKKaVKgMcGuEXEZowZi/1D3ht4X0T2GWNewH6ObCUwzhgzALAB57GPYSAi540xL2Jv\ncABeEMdgt1JKqeLn0fssROQr4Kvryqa5/D4JcHtCWETeB973ZP2UUkrlj97BrZRSKk/aWKgioRHl\nnpdbRPnWrVsJDQ0lLCyM0NBQVq5c6XY5Z+xKWFgY9evXtyIvZs6caZUHBQVRoUIFUlJSco31jo6O\ntspd7/L+6KOPsqxjjGHv3r1cvHgxS3nt2rWt7K1x48ZZ5U2bNrXurl63bl2WdW655Ra+/PLLQh0L\n2P/OQUFBBAcHM3z4cNLT04viT1M+5Of62pvhR++zKB00otxzcosoT0tLk4yMDBEROXnypPj6+lqx\n4DkZMGCAfPLJJ9nKly1bJnfeeWe28txivceNGyfTp0/PVh4fHy9NmzZ1u/9WrVrJ999/n6381Vdf\nldGjR2crP3PmjNx2221y+fLlQh3LkSNHpEmTJnL58mXJzMyUwYMHy6JFi7KtUxrfV55EKbjPQilA\nI8qLI6K8SpUqVKhgH4K8fPkykHvO1cWLF9m8eTMDBw7M9lxOcRg5xXpnZmby6aefMmzYsHxvKyEh\ngZSUFDp27JjvdT799FPuvvtuKlWqVOhjycjI4MqVK9hsNn777Tduv/32bOso9zSivIxYvXo1p0+f\nLtJt1qtXj379+t3QNjSivHgiysGe8Dt69GiOHj3Kv//9b6vxc2fZsmVERkZmS6lNTU1l3bp1vPvu\nu9nWySnWe+PGjTRs2JDAwMAs5SLC0qVL+frrr7OtExMTw7Bhw6y5KJwOHTrEyZMn6d69u9v9uzb+\nBT2WRo0aMX78eBo0aMAtt9xCVFRUlhkBVe60Z6E8SiPKiyeiHOzn8Pft28e2bduYPn26lcXlTk7f\n3lesWEH37t2tPCyn3GK9c9rWli1bqFWrltvJmHJqeGJiYhgyZIg1WZLTiRMnOHDgAL179y70sSQn\nJ/Pll19y+PBhTp06xfnz57MERarcac+ijLjRHoCniEaUF0tEufNUGUBQUBAVK1a0Bqevd+bMGXbu\n3On2/8zixYsZMWJEtvKcYr0zMjJYsWJFltNlrtty9yG+Y8cOKlSo4LZ3tHjxYt57771s5UuWLOGe\ne+6xTrUV5ljWrFmTZfD8j3/8I1u2bHF7+kxlpz0L5VEaUV4whY0oP3z4sDWWcfjwYZKSkmjUqJHb\nfSxdupSBAwdSsWLFLOUXLlxgy5YtVu/HVU7f3r/55htCQkKoX79+lvJr167x2WefFWgcY9++fVy+\nfNn6UpCfdQpyLA0bNmTr1q1cvnwZEWH9+vXlKtbjRmljoTzKNaI8NDSUTp06kZiYSEpKClFRUYSG\nhtKrV68sEeUzZswo9AC3a0R5WFgYERERREVF0bBhQyuiPDIyMltEeWxsrLUNZ0R5p06d8PLyyhJR\nvmDBAiIiIjh69KjHI8pHjx6d74jy2NhYWrVqRVhYGNHR0bzzzjvUqmWfAqZPnz6cOXPGWjanb/yf\nf/45/fr1s+a4dnLGersbR8ppWxs2bKBJkyY0bNgwS7lzHCOnU1DuGpekpCTOnDlDly5d8r1/d8fS\nuXNnBgwYQOvWrQkJCaFChQpZLixQufNYkGBx0yBBlZfU1FSqVatGRkYGAwcOZMyYMdY3zwEDBjBv\n3jwCAwOt5QCmT5/O+fPnmTNnTklWHbDP6+Dr68uDDz5Y0lUp08rb+6o0BAkqVapoRLlShac9i5tY\nefsGpFRxKG/vK+1ZKKWUKjLaWCillMqTNhZKKaXypI2FUkqpPHm0sTDG9DXGHDDGJBljnslluWhj\njBhj2joeBxhjLhtjdjl+/uXJeqobpxHlnpdbRPnXX39NmzZtCAkJITw8nI0bN7pdLj4+3vpbtWvX\nzrr58MKFC9Z9L0FBQXz00UfWOhMmTCAoKIgWLVrw5JNPWjcjOgMbW7VqxV133cX58+dL9T6eeuop\ngoODCQ4O5rPPPivw61/u5SeatjA/2KdSPQgEAhWBn4CWbparDmwCfgDaOsoCgL0F2Z9GlJcOGlHu\nOblFlO/YsUNOnTolIiK7du0Sf39/t8v17NlT1qxZIyIiK1askDvuuENERJ5//nmZPHmyiIicPn1a\natasKRkZGRIbGytdu3aVa9euSUZGhrRr1042b94s6enpUrduXUlOThYRkSeffFJefPHFUruP5cuX\nS58+fcRms8mlS5ekTZs2cunSJbevUWl8X3kSpSCivD2QJCKHROQqsBjIniEMLwKzgCtunlNlgEaU\n24/DkxHlbdq0sSI3QkJCSE1NJSMjI9tyxhh+/fVXwB5f4ozoNsZYMSupqanUqVMHb29vjDFcuXKF\nq1evkp6ejs1mw9fX1/oASUtLQ0S4dOlSlm2Vtn3s37+fHj164O3tTbVq1QgODs41i0y5kZ8WpTA/\nQDSwwOXxCOCN65ZpDXzu+H0jWXsWacBOIBbomtf+ynvP4sCBFyRux71F+nPgwAsFrtP1PYv//e9/\n0q1bN0lLSxMRkZdeekmmT58up0+flpYtW0pmZqaIiFy4cEFEbrxncfz4cWnUqJGcPXtWrl69Kt26\ndZP//Oc/cuzYMQkICJDz589Lenq6dOzYUcaPHy8iIpMnT5a33nrL2lbz5s1l27ZtIiIyYcIECQ0N\nFRH7BEPOiXcSEhKkffv2IiKydu1aqVWrlpw+fVouX74sv/vd7+T5558XEZFXXnlFJkyYYB3b8OHD\nRUTks88+k1tvvVX27dsn165dk9DQUNmzZ4+IiPVNOiMjQ7p06SL79u2z6tajRw/ZtWtXrq9FTEyM\n9OnTx+1ze/fuFT8/P/H39xc/Pz85duyYiIikpKRI165dpX79+lK1alVZvXq1tc748eOlRo0acuut\nt8q0adOs8sWLF0u1atWkXr160qNHD2uypdK4j1WrVknXrl3lt99+kzNnzkijRo1k3rx5bl8j7VkU\nf8/CuCmz7gA0xngBc4EJbpb7BWgoIq2BvwH/Nsbcmm0HxjxsjIkzxsSdPXu2iKqtipJGlBdfRDnA\nnj17mDJlCm+//bbb5998803efPNNjh8/zqxZsxg9ejQAX331Fe3bt+fkyZPs2LGDMWPGkJqayoED\nBzh48CAnT57k+PHjrF69mi1btnD16lXeeecddu/ezcmTJ2nWrBmzZs0qtfu466676N27Nx07dmT4\n8OF07NgxW4Ktyp0nX60TQAOXx/6A6//y6kAwsNExAUo9YKUxZoCIxAHpACKywxhzEPgDkOUWbRGZ\nD8wH+x3cHjqOm8If/jC1pKvglmhEebFFlB87dozBgwfz8ccf07hxY7fH8PHHH/PWW28BMHToUB57\n7DEAPvjgA5577jmMMTRr1owGDRqQmJjIN998Q6dOnazGvG/fvvzwww8YY/Dx8bH2M2TIEObNm1dq\n99GmTRumTZtm/b8ZMmQITZs2zfFvrbLzZM/iR6CpMaaxMaYiMAywZpEXkRQRqSMiASISgH2Ae4CI\nxBlj6hpjvAGMYWnRfgAAC5RJREFUMYFAU8D9ZSCqVNOI8oIpbES58yqgV155hYiIiBy3/7vf/Y7v\nvvsOsI+1NGvWDLDHd69fvx6w97SSkpJo3LgxDRs2JDY2FpvNRkZGBrGxsdbUqnv27CE5OdnaljMi\nozTuw2azWVdS7dy5k4SEBO64447C/ZHKKY/1LETEZowZC3yD/cqo90VknzHmBeznyFbmsno34AVj\njA24BjwqIuc9VVflOa4R5c6Z22bMmEHlypUZPHgw6enpZGZmZokof+SRR5gzZw7Lly8nICCgQPtz\njSgXEfr3709UVBSAFVHu5+eXLaLcdYDZGVFevXp1unXrliWiPDo6mpiYGHr37u3xiPLAwMB8R5S/\n9tprHD58mGeffZZnn30WgPXr11O7dm1GjRrF+PHjCQsL47333mPcuHFcu3aNypUr88477wDw3HPP\nMXLkSJYuXUpmZiavvPIKtWrVYtiwYWzcuJFWrVoBEBUVZU00NGXKFLp06YKPjw8BAQF8+OGHAKVy\nH2lpaVbEeY0aNfjkk09ynXZWZadBgjex8hZ4dqM0olzlR3l7X2mQoFLX0YhypQpPexY3sfL2DUip\n4lDe3lfas1BKKVVktLFQSimVJ20slFJK5UkbC6WUUnnSxkIVCY0o97yiiChPTk7mjjvuoGnTpvTp\n04eUlBQP1liVJdpYqCKxbds2du3axQsvvMDQoUOtu4sLelNdYRuLG5GRkcGiRYsYOnRose63oB59\n9FFmz57t9jlfX19WrVrFnj17eP/99xkxYoTb5aZPn06/fv3473//S9euXa2sJaXyoo2F8jiNKLcf\nR2mIKF+xYoV1U9+DDz7I8uXLC/Uaq/JHYxfLiKn/PcHe1MtFus3gapV5san/DW3jzJkzzJw5k/Xr\n11OlShWmT5/Oa6+9xl/+8he++uor9u3bhzGGixcvUrNmTe666y6io6MZNGhQofZ34sQJpkyZQlxc\nHDVq1KB37958+eWXhIaGMnPmTOLj46latSo9evSwggm///57wsPDrW2MGjWKDz/8kPbt2/PUU09Z\n5fXr12ft2rVUqlSJn3/+mQcffNBqMH766ScSEhKoUaMGAQEBPPbYY/z444/MmTOHN954g1deeQWw\n50tt2LCBzz//nP79+7N161aaN29OmzZt2Lt3L8HBwcycOZPbbrsNm81mNUItW7bE29ubgIAA9u7d\nS2hoaI6vwdKlS+nQoQM+Pj7ZnktOTrbiQvz8/Pjll18K9Tqr8kd7FsqjNKK8dEWUX8+R+KxUnrRn\nUUbcaA/AUzSivHRFlNeuXZuzZ89St25dTp48Sb169XI8XqVcac9CeZRGlBeMpyPKBwwYYCW3fvjh\nhwwc6G6mY6Wy08ZCeZRrRHloaCidOnUiMTGRlJQUoqKiCA0NpVevXlkiymfMmFHoAW7XiPKwsDAi\nIiKIioqiYcOGVkR5ZGRktojy2NhYaxvOiPJOnTrh5eWVJaJ8wYIFREREcPToUY9HlI8ePbpQEeXO\ny5ad80CMGjXKuqx48uTJrFq1iqZNm7Jp0yYmTpxY5MegyiYNEgRY/Qyc3lO0FSoGCcF/p0Xj20u6\nGjeN1NQ0qlWrao8oHzGGMaPuo3+fXgAMuP9R5r00mcCAhtZyANNffZvzFy8y54WST56d/cYCfOvc\nxoPDBpd0Vcq0hMOnaLH3JrukuF4I9JtZqFXzGySoYxaq3Jg68zU2fr+NK+np9O3Vjbsje1rP/b9p\nT3Hq9BkCAxqy8ptvmfX6u9iuXSOggR8LXy/cm7Co1a5Vk/v/pKeNVMnwaM/CGNMXeA37THkLRMTt\nu84YEw18CrRzzL+NMWYS8BfsM+WNE5Fv3K3rpBHlSqmiUN7eVyXes3DMof0mcCdwAvjRGLNSRPZf\nt1x1YBywzaWsJfY5u4OA24F1xpg/iEj2u5GUUkp5nCcHuNsDSSJySESuAosBd33oF4FZwBWXsoHA\nYhFJF5HDQJJje+o6ZWXMSanSQN9POfNkY+EHHHd5fMJRZjHGtAYaiMiXBV3Xsf7Dxpg4Y0zc2bNn\ni6bWN5FKlSqRnJys/8GVKgIiQnJyMpUqVSrpqpRKnhzgdndrqPWpZozxAuYCIwu6rlUgMh+YD/Yx\ni0LV8ibm7+/PiRMnKI8NpVKeUKlSJfz9S+cNriXNk43FCaCBy2N/wDWnoDoQDGx0RA7UA1YaYwbk\nY10F+Pj45HinrlJKFSVPnob6EWhqjGlsjKmIfcB6pfNJEUkRkToiEiAiAcAPwADH1VArgWHGmFuM\nMY2BpsB2D9ZVKaVULjzWsxARmzFmLPAN9ktn3xeRfcaYF4A4EVmZy7r7jDFLgf2ADXhcr4RSSqmS\no3dwK6VUOZbf+yzKTGNhjDkLHC3pehRCHeBcSVeimOkxlw96zDeHRiKSPXDsOmWmsbhZGWPi8tOq\nlyV6zOWDHnPZoqmzSiml8qSNhVJKqTxpY1Hy5pd0BUqAHnP5oMdchuiYhVJKqTxpz0IppVSetLEo\nRYwxTxljxBhTp6Tr4mnGmNnGmJ+NMbuNMV8YY2qWdJ08wRjT1xhzwBiTZIx5pqTr42nGmAbGmA3G\nmARjzD5jzPiSrlNxMcZ4G2N2GmOuD0YtE7SxKCWMMQ2wz/1xrKTrUkzWAsEi0gpIBEp+3tIi5jKn\nSz+gJXCvY66WsswGTBCRFkAE8Hg5OGan8UBCSVfCU7SxKD3mAn/HTbpuWSQia0TE5nj4A/awyLIm\nv3O6lBki8ouIxDt+v4T9wzPb9AJljTHGH4gCFpR0XTxFG4tSwJG0e1JEfirpupSQPwOrS7oSHpCv\neVnKKmNMANAal1kwy7B52L/sZZZ0RTzFkxHlyoUxZh32GPbr/QOYDEQWb408L7djFpEVjmX+gf3U\nxSfFWbdikq95WcoiY0w14HPgCRH5taTr40nGmLuBMyKywxjTo6Tr4ynaWBQTEentrtwYEwI0Bn5y\nzOvhD8QbY9qLyOlirGKRy+mYnYwxDwJ3A3dI2byGu1zOy2KM8cHeUHwiIstKuj7FoDMwwBhzF1AJ\nuNUY87GI3F/C9SpSep9FKWOMOQK0FZGbLYysQIwxfYFXge4iUian+jPGVMA+eH8HcBL7HC/3ici+\nEq2YBxn7N54PgfMi8kRJ16e4OXoWT4nI3SVdl6KmYxaqpLyBfbbEtcaYXcaYf5V0hYqaYwDfOadL\nArC0LDcUDp2BEUAvx991l+Mbt7rJac9CKaVUnrRnoZRSKk/aWCillMqTNhZKKaXypI2FUkqpPGlj\noZRSKk/aWChVAMaY1Btc/zNjTKDj92rGmHeMMQcdCa2bjDEdjDEVHb/rTbOq1NDGQqliYowJArxF\n5JCjaAFwHmgqIkHASKCOI3RwPTC0RCqqlBvaWChVCMZutjFmrzFmjzFmqKPcyxjzlqOn8KUx5itj\nTLRjteGAMxOrCdABmCIimQCOdNpVjmWXO5ZXqlTQbq5ShTMYCANCgTrAj8aYTdjvYA4AQgBf7Hdu\nv+9YpzMQ4/g9CNglItdy2P5eoJ1Haq5UIWjPQqnC6QLEiMg1EfkfEIv9w70L8KmIZDqCIDe4rFMf\nyFcOlqMRuWqMqV7E9VaqULSxUKpw3MWP51YOcBl7KinAPiDUGJPbe/AW4Eoh6qZUkdPGQqnC2QQM\ndcy7XBfoBmwHvgPucYxd/A7o4bJOAvB7ABE5CMQBzzuSWjHGNDXGDHT8Xhs4KyIZxXVASuVGGwul\nCucLYDfwE/At8HfHaafPsc9jsRd4B/sscSmOdVaRtfF4CPvkUEnGmD3Au/zffBc9ga88ewhK5Z+m\nzipVxIwx1UQk1dE72A50FpHTxpjK2McwOucysO3cxjJgkogcKIYqK5UnvRpKqaL3pTGmJlAReNE5\n46GIXDbGPIt9Hu5jOa1sjKkILNeGQpUm2rNQSimVJx2zUEoplSdtLJRSSuVJGwullFJ50sZCKaVU\nnrSxUEoplSdtLJRSSuXp/wOubAWCPVOOtwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier SVC(C=10, cache_size=200, class_weight=None, coef0=0.0,\n",
      "  decision_function_shape='ovr', degree=3, gamma=0.01, kernel='rbf',\n",
      "  max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
      "  tol=0.001, verbose=False):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.84      0.82      0.83        96\n",
      "          1       0.72      0.74      0.73        58\n",
      "\n",
      "avg / total       0.79      0.79      0.79       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[79 17]\n",
      " [15 43]]\n"
     ]
    }
   ],
   "source": [
    "SVC3 =  SVC( C = 10, kernel='rbf', gamma = 0.01)\n",
    "SVC3 = SVC3.fit(X_train_resampled, y_train_resampled)\n",
    "\n",
    "import sklearn.metrics as metrics\n",
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC3.predict(X_test)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC3, metrics.classification_report(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RBF核的SVM：准确率与召回率进一步提升"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
